Amazon Bedrock AgentsとAWS Chatbotを使用したSlack生成AIチャットボットをCloudFormationで実装してみた

Amazon Bedrock AgentsとAWS Chatbotを使用したSlack生成AIチャットボットをCloudFormationで実装してみた

Clock Icon2024.11.03

こんにちは、つくぼし(tsukuboshi0755)です!

少し前になりますが、AWS ChatbotがMicrosoft TeamsやSlackからのAmazon Bedrock Agentsとのやり取りに対応したというアップデートがありました。

https://aws.amazon.com/jp/about-aws/whats-new/2024/09/aws-chatbot-amazon-bedrock-agent-microsoft-teams-slack/

今回はこちらの機能を用いつつ、さらに簡単に設定できるようCloudFormationでSlack生成AIチャットボットを実装してみたので、その手順をご紹介します!

アーキテクチャ解説

今までのアップデートと比較して、今回のアップデートを用いた構成がどのようなメリットを持つかについて解説します。

このアップデートが出る前まで、SlackまたはTeamsでBedrock ModelやBedrock Agentsを呼び出すには、バックエンド連携部分の開発が必須になっていました。

例えばバックエンドにECSを用いる場合は以下のような構成になり、アプリケーションコードの開発や運用について別途検討する必要がありました。

bedrock-agents-chatbot-slack-for-cloudformaiton-1

しかし今回のアップデートが出現した事で、バックエンド連携部分をChatbotで簡単に設定できるようになりました。

その結果、以下のような構成を用いる事で、アプリケーションコードの開発なしでBedrock Agentsを呼び出す事ができるようになっています。

bedrock-agents-chatbot-slack-for-cloudformaiton-2

上記構成を用いる事で、主に以下2点のメリットが生まれます。

  1. アプリケーション開発に不慣れな方でも、気軽にSlackまたはTeams上で生成AIチャットボットを実装可能
  2. Bedrock Agentsを呼び出すため、Knowledge BasesやAction Groups等の設定を追加する事で、RAGや外部APIの呼び出しといった機能拡張が容易に可能

これにより、簡単かつ拡張性の高い生成AIチャットボットを実装できるようになっています!

構築手順

今回の構築手順では、Slack生成AIチャットボットに必要な最小限のBedrock Agents設定のみで実装してみます。

Bedrockモデルアクセスの有効化

もしBedrock Agentsで使用するモデルを有効化していない場合、以下を参考にモデルを有効化してください。

https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/getting-started.html

SlackチャンネルIDの取得

生成AIチャットボットからメッセージを投稿する際に、チャンネルIDが必要になります。

事前に該当のSlackチャンネルの詳細を開き、下の方からコピーしてください。

bedrock-agents-chatbot-slack-for-cloudformaiton-10

AWS Chatbotでのチャットクライアント設定

次にAWS Chatbotコンソールから、Chatbotでチャットクライアントを設定します。

コンソールのトップページのチャットクライアントをSlackに設定した後、クライアントを設定ボタンをクリックしてください。

bedrock-agents-chatbot-slack-for-cloudformaiton-3

次にSlack認証ページでワークスペースにアクセスするため、許可するボタンをクリックしてください。

bedrock-agents-chatbot-slack-for-cloudformaiton-4

以下の設定済みクライアントページが表示されれば、チャットクライアントの設定は完了です。

bedrock-agents-chatbot-slack-for-cloudformaiton-5

ワークスペースIDをCloudFormationのパラメータに設定するため、ここでコピーしておいてください。

CloudFormationスタックのデプロイ

続いてCloudFormationコンソールから、生成AIチャットボットに必要なBedrock Agents及びChatbotチャネルを構築するためのスタックをデプロイします。

以下のCloudFormationテンプレートをYAML形式で、ローカルに保存してください。

template.yaml
Parameters:
  FoundationModeId:
    Type: String
    Description: The Id of the foundation model.
    Default: "anthropic.claude-3-5-sonnet-20240620-v1:0"
  SlackChannelId:
    Type: String
    Description: The ID of the Slack channel.
    NoEcho: true
  SlackWorkspaceId:
    Type: String
    Description: The ID of the Slack workspace.
    NoEcho: true

Resources:
  BedrockAgentPolicy:
    Type: AWS::IAM::ManagedPolicy
    Properties:
      ManagedPolicyName: !Sub "AmazonBedrockExecutionPolicyForAgents_${AWS::StackName}"
      PolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action:
              - bedrock:InvokeModel
            Resource:
              - !Sub arn:aws:bedrock:${AWS::Region}::foundation-model/${FoundationModeId}

  BedrockAgentRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub "AmazonBedrockExecutionRoleForAgents_${AWS::StackName}"
      ManagedPolicyArns:
        - !Ref BedrockAgentPolicy
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service: bedrock.amazonaws.com
            Action: sts:AssumeRole
            Condition:
              StringEquals:
                aws:SourceAccount: !Ref "AWS::AccountId"
              ArnLike:
                aws:SourceArn: !Sub "arn:aws:bedrock:${AWS::Region}:${AWS::AccountId}:agent/*"

  BedrockAgent:
    Type: AWS::Bedrock::Agent
    Properties:
      AgentName: !Sub "${AWS::StackName}-agent"
      AgentResourceRoleArn: !GetAtt BedrockAgentRole.Arn
      FoundationModel: !Ref FoundationModeId
      Instruction: "あなたはSlack用のチャットボットです。ユーザーと同じ言語で、親切に応対してください。"
      AutoPrepare: true

  BedrockAgentAlias:
    Type: AWS::Bedrock::AgentAlias
    Properties:
      AgentAliasName: !Sub "${AWS::StackName}-agent-alias-v1"
      AgentId: !Ref BedrockAgent

  ChatbotRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub ${AWS::StackName}-chatbot-role
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: "Allow"
            Principal:
              Service: "chatbot.amazonaws.com"
            Action: "sts:AssumeRole"
      ManagedPolicyArns:
        - !Ref ChatbotPolicy

  ChatbotPolicy:
    Type: AWS::IAM::ManagedPolicy
    Properties:
      ManagedPolicyName: !Sub ${AWS::StackName}-chatbot-policy
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: "Allow"
            Action:
              - "Bedrock:InvokeAgent"
            Resource: !GetAtt BedrockAgentAlias.AgentAliasArn

  SlackChatbot:
    Type: AWS::Chatbot::SlackChannelConfiguration
    Properties:
      ConfigurationName: !Sub ${AWS::StackName}-slack-chatbot
      IamRoleArn: !GetAtt ChatbotRole.Arn
      LoggingLevel: INFO
      SlackChannelId: !Ref SlackChannelId
      SlackWorkspaceId: !Ref SlackWorkspaceId

Outputs:
  AgentArn:
    Description: The ARN of the agent.
    Value: !GetAtt BedrockAgent.AgentArn
  AgentAliasId:
    Description: The ID of the agent alias.
    Value: !GetAtt BedrockAgentAlias.AgentAliasId

テンプレートを保存したら、CloudFormationコンソールでスタックを作成していきます。

CloudFormationコンソールでのスタックの作成方法については、以下の公式ドキュメントを参考にしてください。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html

CloudFormationコンソールでスタックの作成を実施し、保存したテンプレートをアップロードします。

以下のスタックの詳細画面では、スタック名及びパラメータを指定する必要があります。

bedrock-agents-chatbot-slack-for-cloudformaiton-6

スタック名に任意の名前を入力した後、以下の通りパラメータの設定を行います。

パラメータ名 説明 備考
FoundationModeId Amazon Bedrock Agentsで使用するFoundation Model ID デフォルトはanthropic.claude-3-5-sonnet-20240620-v1:0
SlackChannelId SlackチャンネルID 先ほどSlackで取得したチャンネルIDを入力
SlackWorkspaceId SlackワークスペースID 先ほどChatbotコンソールで取得したワークスペースIDを入力

パラメータの内容に問題がなければ、スタックをデプロイします。

スタックのデプロイが完了したら、以下の通り出力タブからAgentArnAgentAliasIdの値を各々コピーしておいてください。

bedrock-agents-chatbot-slack-for-cloudformaiton-7

Slackでのコネクタ設定

最後にSlack上で生成AIチャットボットとのコネクタを設定します。

該当のSlackチャンネルで、以下のメッセージを送信してください。

コネクター名は任意の名前でOKです。

Bedrock AgentsのエージェントARNとエイリアスIDは、先ほどCloudFormationコンソールで取得したものを入力してください。

@aws connector add {コネクター名} {Bedrock Agentsのエージェント ARN} {Bedrock AgentsのエイリアスID}

以下のメッセージが表示されれば、コネクターの設定は完了です。

bedrock-agents-chatbot-slack-for-cloudformaiton-8

テスト

最後にSlack上で生成AIチャットボットをテストしてみます。

以下のメッセージを送信し、生成AIチャットボットが正常に応答するか確認してください。

質問は任意の内容でOKです。

@aws ask {コネクター名} {質問}

以下の通り正常にメッセージが返ってきれば、生成AIチャットボットの設定は完了です!

bedrock-agents-chatbot-slack-for-cloudformaiton-9

慣れてきたらBedrock AgentsにKnowledge BasesやAction Groups等の設定を追加し、ぜひ機能拡張してみてください!

最後に

今回はAWS ChatbotとAmazon Bedrock Agentsを用いて、CloudFormationでSlack生成AIチャットボットを実装してみました。

このアップデートにより、とてもシンプルな形でAWS上に生成AIチャットボットを構築できるようになっています。

さらにAgentsの設定をカスタマイズする事でRAGや外部APIを呼び出せるようになるため、拡張性にも優れています。

ぜひこの記事を参考に、Slack上での新しい生成AIチャットボットの実装を試してみてください!

以上、つくぼし(tsukuboshi0755)でした!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.